perm filename ROM.FAI[CMS,LCS] blob
sn#298151 filedate 1977-07-24 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00013 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 .INSERT ASMBL.FAI[CMS,LCS]
C00003 00003 BIT RATE GEN CODES
C00006 00004 MAIN DDT LOOP
C00008 00005 C3: CMPI "G" 2
C00010 00006 TTY MODE CHECK THIS OUT FIRST
C00013 00007 PRINT ADDRESS/VAL
C00015 00008 INPUT FROM BEEHIVE
C00016 00009 RESET BEEHIVE I/O
C00018 00010 UNLOADER
C00020 00011 OUTSTR OUT TO BEE IF TFLG IS CLEAR OR MODEM IF NOT EQUAL
C00022 00012 BLT ROUTINE
C00023 00013 ROM INTER VECTS
C00024 ENDMK
C⊗;
.INSERT ASMBL.FAI[CMS,LCS]
; RAM
PCL: 0 ;0
PCH: 1 ;1
PS: 2 ;2
A: 376 ;3
X: 176 ;4
Y: 377 ;5
SP: 377 ;6
ONMIA: 377 ;7
BEES: 377 ;10 OLD BEEHIVE STATUS
OBEEC: 377 ;11 DEFAULT BEEHIVE CONTROL WORD
BEEB0: 377 ;12
BEEB1: 377 ;13
ADR: 377 ;14
377 ;15
VAL: 377 ;16
TFLG: 377 ;17
TMP: 377 ;20
377 ;21
111 ;22 ← FF MARK
; ODT RAM & INTERUPT VECTORS
LOC 1000
IRQA: REPEAT 3,{111↔} ;1000 - 1002
IRQB: REPEAT 2,{111↔} ;1003 - 1004
NMIA: REPEAT 3,{333↔} ;1005 - 1007
377 ;1010 ← FF MARK
; BIT RATE GEN CODES
; 0 = 0 10 = 9600
; 1 = 19.2K DON'T USE 11 = 4800
; 2 = 50 12 = 1800
; 3 = 75 13 = 1200
; 4 = 134.5 14 = 2400
; 5 = 200 15 = 300
; 6 = 600 16 = 150
; 7 = 2400 17 = 110
; EPROM STARTS HERE
LOC 176274 ;TOP 1K SHOULD BE 176000
; LOC 176000
BEEC ← 174100 ↔ BEED ← 174101 ;BEEHIVE CONTROL AND I/O ADDRESS
MODC ← 174120 ↔ MODD ← 174121 ;MODEM CONTROL AND I/O ADDRESS
BEEDEF←MODDEF←25 ;BEEHIVE AND MODEM CONTROL DEFAULTS
BBRDEF←MBRDEF←15 ;BIT RATE DEFAULTS 15=300 (FASTER FOR BEE?)
BBIT←20 ;BREAK BIT
; BREAK OPCODE CHECK
BRKCK: STAZ A ;SAVE A 2
PLA ;GET OLD PS 1
PHA ;RESTORE STACK 1
ANDI BBIT ; 2
BNE BRKIN ;AND CK FOR BRK 2
LDAZ A ; 2
JMPIN IRQB ;ELSE JUMP @IRQB 3
PTBL: 4 ;PS (4 IS IBIT?) 1
20 ;PCL 1
2 ;PCH 1
VINIT: JMP BRKCK ;INTERUPT JMP CODE 3
10 ;I/O 1
2 ; 1
JMP ODT ; 3
; RESET STARTS HERE
RSTA: LDAI BEEDEF ;SETUP BEE CONTROL 2
STAZ OBEEC ;WORD DEFAULT 2
LDAI BBRDEF ;SETUP BRATE DEFAULT 2
STAZ BEEB0 ; 2
STAZ BEEB1 ; 2
LDXI 2 ; 2
PLOOP: LDAX PTBL ;SETUP PC AND PS 3
PHA ; 2
DEX ; 1
BPL PLOOP ; 2
LDXI 7 ; 2
JLOOP: LDAX VINIT ;SETUP INT VECT 3
STAX 1000 ; 3
DEX ; 1
BPL JLOOP ; 2
; JUMP TO HERE FOR DDT AND SAVE EVERYTHING
ODT: STAZ A ;SAVE A 2
BRKIN: LDA 1005 ;NMIA 3
STAZ ONMIA ;SAVE NMIA AND FORCE 2
LDAI RTI ;RETURN FROM INTERUPT 2
STA 1005 ;ON NMI 3
STXZ X ;SAVE X 2
STYZ Y ;SAVE Y 2
PLA ; 1
STAZ PS ;SAVE PS AND PC 2
PLA ; 1
STAZ PCL ; 2
STAZ ADR ;SETUP ADDRESS 2
PLA ; 1
STAZ PCH ; 2
STAZ ADR+1 ; 2
TSX ; 1
STXZ SP ;SAVE STACK PONITER 2
CLD ;FORCE BINARY 1
NIN: JSR SETBEE ;INIT BEEHIVE I/O 3
; MAIN DDT LOOP
PLF: LDAI 12 ;PRINT LF 2
JSR PCHR ; 3
PCR: LDAI 15 ;PRINT CR 2
JSR PCHR ; 3
LDXI 0 ; 2
LDAIX ADR ;GET CONTENTS 2
STAZ VAL ; 2
JSR PAV ;PRINT ADDRESS/VAL 3
LDAI " " ;PRINT SPACE 2
JSR PCHR ; 3
STXZ TMP ;X IS 0 2
STXZ TMP+1 ; 2
STXZ TFLG ; 2
NXTCHR: JSR GCHR ;WAIT TILL CHR 3
ANDI 177 ;STRIP TOP BIT 2
JSR PCHR ;ECHO IT 3
CMPI "↑" ;CHECK THIS 2
BNE C1 ; 2
LDAZ ADR ;STEP BACK 2
BNE NOD ; 2
DECZ ADR+1 ; 2
NOD: DECZ ADR ; 2
JMP PLF ; 3
C1: CMPI 12 ;LF 2
BNE C2 ; 2
LDAZ TFLG ;STEP FORWARD 2
BEQ NODEP ; 2
LDAZ TMP ;DEPOSIT 2
STAIX ADR ; 2
NODEP: INCZ ADR ;STEP 2
BNE PCR ; 2
INCZ ADR+1 ; 2
JMP PCR ; 3
C2: CMPI "/" ; 2
BNE C3 ; 2
LDAZ TFLG ;CHECK FOR NEW ADDRESS 2
BEQ EROR ;NO ADDRESS 2
LDAZ TMP ;EXAMIN 2
STAZ ADR ; 2
LDAZ TMP+1 ; 2
STAZ ADR+1 ; 2
JMP PLF ; 3
C3: CMPI "G" ; 2
BNE C4 ; 2
GO: LDAZ BBRDEF ;LEAVE DDT 2
STA BR0 ;DEFAULT BIT RATE 3
STA BR0 ; 3
LDAZ OBEEC ; 2
STA BEEC ;BEEHIVE CONTROL 3
LDXZ SP ;SETUP STACK 2
TXS ; 1
LDAZ PCH ; 2
PHA ; 1
LDAZ PCL ; 2
PHA ; 1
LDAZ PS ; 2
PHA ; 1
LDXZ X ; 2
LDYZ Y ; 2
LDAZ ONMIA ;FIX FIRST NMI BYTE 2
STA 1005 ; 3
LDAZ A ; 2
RTI ;START PROGRAM 1
C4: CMPI "T" ;CHECK FOR TTY MODE 2
BEQ TTY ; 2
CMPI "B" ;CHECK FOR BOOTSTRAP 2
BEQ BOOT ; 2
CMPI "L" ;CHECK FOR LOAD 2
BEQ BOOT ; 2
CMPI "U"
BNE CKMT
JMP UNLOAD
CKMT: CMPI "M"
BNE NUM
JMP MTST
NUM: CMPI 60 ;CHECK FOR OCTAL NUM 2
BCC EROR ; 2
CMPI 70 ; 2
BCS EROR ;ERROR ON UNKNOWN 2
LDXI 3 ;NUMBER OF BITS 2
SLOOP: ASLZ TMP ;SHIFT TMP AND TMP+1 2
ROLZ TMP+1 ; 2
DEX ; 1
BNE SLOOP ; 2
ANDI 7 ; 2
ORAZ TMP ;STUFF IT AT BOTTOM 2
STAZ TMP ; 2
INCZ TFLG ;SET TMP FLAG 2
BNE NEXT ; 2
EROR: LDAI 7 ;↑G 2
JSR PCHR ;RING BELL 3
NEXT: JMP NXTCHR ; 3
; TTY MODE CHECK THIS OUT FIRST
TTY: JSR SETMOD ;INIT MODEM 3
JSR SETNMI ;SETUP INTERUPT VECTOR 3
TLOOP: LDA BEEC ;CKECK IF BEE TRANS 3
ANDI 2 ;REG IS EMPTY 2
BEQ NOB ; 2
LDA MODC ;CHECK MOD RECV 2
LSRA ;FOR CHR 1
BCC NOB ; 2
LDA MODD ;GET CHR FROM MODEM 3
STA BEED ;OUTPUT TO BEE 3
NOB: LDA MODC ;CHECK IF MOD TRANS 3
ANDI 2 ;REG IS EMPTY 1
BEQ TLOOP ; 2
LDA BEEC ;CK MOD RECV 3
LSRA ;FOR CHR 1
BCC TLOOP ; 2
LDA BEED ;GET CHR FROM BEE 3
STA MODD ;OUTPUT TO MODEM
JMP TLOOP ; 3
; BOOT STRAP
BOOT: PHA ;SAVE DDT CHR 1
LDAZ PCL
STAZ ADR
LDAZ PCH
STAZ ADR+1 ; 2
JSR SETNMI ;INIT INTERUPT VECTOR 3
INX ;CKECK THIS 2
LDAI "↑" ;OUTPUT CHR TO 2
JSR WMOD ;INIT BOOTSTRAP 3
BOTLOP: LDYI 1 ; 2
HALF: JSR RMOD ;GET CHR 3
ANDI 177 ; 2
CMPI "@" ;CHECK IF DONE 2
BEQ DONE ; 2
BCS XBELL ; 2
CMPI 60 ; 2
BCC XBELL ; 2
PHA ;SAVE CHR 1
LDAI 5 ; 2
STA BEED ; 3
PLA ; 1
LOADIT: DEY ;CHECK IF FIRST 1
BNE NIBL ; 2
ASLA ;SHIFT HALF WAY 1
ASLA ; 1
ASLA ; 1
ASLA ; 1
STAZ TFLG ;SAVE TOP 2
JMP HALF ; 3
NIBL: ANDI 17 ; 2
ORAZ TFLG ;ADD TOP 2
STAIX ADR ;STORE @ADR 2
INCZ ADR ;ADR ← ADR + 1 2
BNE BOTLOP ;NEXT 2
INCZ ADR+1 ; 2
BNE BOTLOP ; 2
DONE: PLA ; 1
CMPI "L" ; 2
BEQ LOAD ; 2
JMP GO ;START ON BOOT 3
LOAD: JMP RSN ; 3
XBELL: LDAI 7 ;BELL (↑G) 2
STA BEED ;DON'T WAIT 3
LDAI 0 ; 2
BEQ LOADIT ; 2
; PRINT ADDRESS/VAL
PAV: LDXI 1 ;# OF CHRS 2
STXZ TFLG ;SET BIT MASK 2
LDYI 2 ;# OF BITS + C 2
JSR RLOOP ;PRINT 0 OR 1 3
LDXI 5 ; 2
LDAI 7 ; 2
STAZ TFLG ; 2
JSR CLOOP ;PRINT 5 NUMS, 0 - 7 3
LDAI "/" ; 2
JSR PCHR ;PRINT / 3
LDXI 1 ; 2
LDYI 3 ;BIT MASK AND 2
STYZ TFLG ;# OF BITS +1 2
JSR DLOOP ;PRINT 0 - 3 3
LDXI 2 ; 2
LDAI 7 ; 2
STAZ TFLG ; 2
JSR CLOOP ;PRINT 2 NUMS, 0 - 7 3
RTS ; 1
CLOOP: LDYI 3 ;FOR 3 BITS TO A NUM 2
RLOOP: ROLZ VAL ;ROTATE ADR VAL 2
ROLZ ADR ; 2
ROLZ ADR+1 ; 2
DLOOP: DEY ; 1
BNE RLOOP ; 2
LDAZ VAL ;GET NEXT NUMBER 2
ANDZ TFLG ; 2
ORAI 60 ;MAKE ASCII 2
JSR PCHR ;PRINT IT 3
DEX ; 1
BNE CLOOP ;NEXT NUM 3
RTS ; 1
; INPUT FROM BEEHIVE
GCHR: LDA BEEC ; 3
LSRA ;CHECK IF EMPTY 1
BCC GCHR ; 2
LDA BEED ;GET CHR 3
RTS ; 1
; OUTPUT TO BEEHIVE
PCHR: PHA ;SAVE CHR 1
WAIT: LDA BEEC ; 3
ANDI 2 ;CHECK IF FULL 2
BEQ WAIT ; 2
PLA ; 1
STA BEED ;PRINT IT 3
RTS ; 1
; INPUT FROM MODEM
RMOD: LDA MODC ; 3
LSRA ;CHECK IF EMPTY 1
BCC RMOD ; 2
LDA MODD ;GET CHR 3
RTS ; 1
; OUTPUT TO MODEM
WMOD: PHA ;SAVE CHR 1
FULL: LDA MODC ; 3
ANDI 2 ;CHECK IF FULL 2
BEQ FULL ; 2
PLA ; 1
STA MODD ;OUTPUT IT 3
RTS ; 1
; RESET BEEHIVE I/O
BR0 ← 174140 ↔ BR1 ← 174141 ;BEE BRATE IN/OUT ADDR
BR2 ← 174142 ↔ BR3 ← 174143 ;MOD BRATE IN/OUT ADDR
SETBEE: LDA BEEC ;SAVE OLD BEE STATUS 3
STAZ BEES ; 2
LDAZ BEEB0 ;SETUP BEEHIVE BIT RATE 2
STA BR0 ;CHANELS 3
LDAZ BEEB1 ;SETUP BEEHIVE BIT RATE 2
STA BR1 ; 3
LDAI 3 ;RESET ACIA 2
STA BEEC ; 3
LDAI BEEDEF ;SETUP DEFAULT BEE I/O 2
STA BEEC ; 3
RTS ; 1
; RESET MODEM I/O
SETMOD: LDAI MBRDEF ; 2
STA BR2 ;SETUP BRATE CHANELS 3
STA BR3 ; 3
LDAI 3 ;RESET ACIA 2
STA MODC ; 3
LDAI MODDEF ;SETUP DEFAULT MOD I/O 2
STA MODC ; 3
RTS ; 1
IVJ: PLA
PLA
PLA
RSN: LDAI RTI
STA 1005
JMP NIN
; SETUP NMI INTERUPT VECTOR JUMP
SETNMI: LDXI 12 ; 2
ILOOP: LDAX IVJ ;BLT IVJ TO NMIA 3
STAX 1005 ;NMIA 3
DEX ; 1
BPL ILOOP ; 2
RTS ; 1
; UNLOADER
UNLOAD:
JSR SETNMI
LDAZ PCL
STAZ ADR
LDAZ PCH
STAZ ADR+1 ; 2
INX
LDYI 1 ;UNLOADS FROM @PCLH
ULOOP: LDAIX ADR ;ASSUMES X IS 0
DEY
BNE LSNIBL
LSRA ;SHIFT HALF OVER
LSRA
LSRA
LSRA
DOIT: ORAI 60
STAZ TFLG
JSR WMOD
JSR RMOD
CMPZ TFLG
BEQ ULOOP
JMP RSN
LSNIBL: ANDI 17 ;CLEAR LEFT
LDYI 1
INCZ ADR ;ADR ← ADR + 1 2
BNE DOIT ;NEXT 2
INCZ ADR+1 ;IF CARRY 2
BNE DOIT ;UNCONDITIONAL JUMP 2
; MEMORY TEST
MTST: LDYI 0
STYZ PS
MAS: LDAI 3
STAZ PCL
STYZ PCH
ML: LDAIY PCL
TAX
MX: INX
TXA
STAIY PCL
CMPIY PCL
BEQ GOOD
BAD: LDAZ PCL
STAZ ADR
LDAZ PCH
STAZ ADR+1
FINIS: JMP PLF
GOOD: INCZ PS
BNE MX
INCZ PCL
BNE ML
INCZ PCH
LDAZ PCH
CMPI 20 ;4K
BNE MAS
BEQ FINIS
; OUTSTR OUT TO BEE IF TFLG IS CLEAR OR MODEM IF NOT EQUAL
OSTR: TSX
SEI
JSR S2TMP
LDXI 0
SOUT: LDAIX TMP
BMI ENDSTR ;BIT 7 IS END DELIMIT
LDYZ TFLG
BNE PMOD ;BEE IF TFLG=0 MOD IF ≠
JSR PCHR
JMP ITMP
PMOD: JSR WMOD
ITMP: INCZ TMP
BNE SOUT
INCZ TMP+1
JMP SOUT
ENDSTR: CLI
TSX
JMP POPS ;FIX STACK
S2TMP: LDAX 403
STAZ TMP
LDAX 404
STAZ TMP+1
RTS
; GET PC SUB
GETPC: TSX ; 2
LDAX 402 ;ZERO PAGE + 1 3
PHA ; 1
LDAX 401 ; 3
PHA ; 1
RTS ; 1
; 16 BIT ARITH
; FIXED BY REM TO HAVE ARGS AND RESULT IN USUAL LOW-HIGH ORDER
ADD16: TSX ; 1 (FIXED BY REM, WAS TXS)
LDAX 405 ;GET LOW 3
CLC ; 1
ADCX 403 ; 3
STAX 405 ; 3
LDAX 406 ;GET HIGH 3
ADCX 404 ; 3
FIXS: STAX 406 ; 3
;Now bubble return address up two bytes on stack
POPS: PLA ; 1
STAX 403 ; 3
PLA ; 1
STAX 404 ; 3
RTS ; 1
SUB16: TSX ; 1 (FIXED BY REM, WAS TXS)
LDAX 405 ;GET LOW 3
SEC ; 1
SBCX 403 ; 3
STAX 405 ; 3
LDAX 406 ;GET HIGH 3
SBCX 404 ; 3
JMP FIXS ; 3
; BLT ROUTINE
BLTR: TSX
SEI
LDAX 410 ;STACK SHOULD HAVE
STAZ ADR+1 ;+10 SOR ADR H&L
LDAX 407 ;+6 DEST ADR H&L
STAZ ADR ;+4 LAST DEST ADR H&L
LDAX 406
STAZ PCH
LDAX 405
STAZ PCL
JSR S2TMP
LDXI 0
BLTLOP: LDAIX ADR
STAIX TMP
LDAZ TMP
CMPZ PCL
BNE INCIT
LDAZ TMP+1
CMPZ PCH
BEQ ENDBLT
INCIT: INCZ ADR
BNE INCT
INCZ ADR+1
INCT: INCZ TMP
BNE BLTLOP
INCZ TMP+1
JMP BLTLOP
ENDBLT: CLI
TSX
PLA
STAX 407
PLA
STAX 410
PLA
PLA
PLA
PLA
RTS
; ROM INTER VECTS
LOC 200265
; LOC 177772
0
NMIV: 5
2
RSTV: 30
374
IRQV: 0
2
; NMIV: ABSO NMIA ; 2
; RSTV: ABSO RSTA ; 2
; IRQV: ABSO IRQA ; _2_
; 6
END